/** 
 *  Copyright 2010 Matthew Werny & Burk Price.
 * 
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 * 
 *       http://www.apache.org/licenses/LICENSE-2.0
 * 
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *  under the License.
 */
package net.iceflow.db.migration.executer;

import net.iceflow.db.migration.exception.MigrationException;
import groovy.lang.Binding;
import groovy.lang.GroovyShell;
import net.iceflow.db.jdbc.DatabaseType;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.Validate;
import org.springframework.core.io.Resource;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;

public class GroovyMigrationExecuter extends AbstractMigrationExecuter {

   private final Resource script;

   public GroovyMigrationExecuter(String version, Resource script) {
      super(version, script.getFilename());
      this.script = script;
   }

   public void migrate(DatabaseType dbType, Connection connection) {
      Binding binding = new Binding();
      binding.setVariable("connection", connection);
      GroovyShell shell = new GroovyShell(binding);

      InputStream inputStream = null;

      try {
         inputStream = script.getInputStream();
         shell.evaluate(IOUtils.toString(inputStream));
         Validate.isTrue(!connection.isClosed(), "JDBC Connection should not be closed.");
      } catch (IOException e) {
         throw new MigrationException(e);
      } catch (SQLException e) {
         throw new MigrationException(e);
      } finally {
         IOUtils.closeQuietly(inputStream);
      }
   }
}
